package com.woniu108.carService.commos.config;


import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


@Configuration
public class RabbitMQConfig {

    @Bean
    public Queue phoneQueue(){
        //发送手机验证码的消息队列
        return new Queue("check_phone_queue");
    }



    /**
     * 定义一个队列并设置过期时间以及死信转发交换机
     * 目标数据向 check_vip_time_queue 队列投递,在checkVipQueue()返回的check_vip_queue队列中消费
     * checkVipQueue()与交换机deleteCacheCheckExchange()绑定,路由器键名称为 checkVip
     * 当投递一个目标数据时,投递到check_vip_time_queue,定时延迟执行时间到期根据key分类由交换机exchange转发到check_vip_queue执行
     */
    @Bean
    public Queue checkUserVipTimeQueue() {
        HashMap<String, Object> map = new HashMap<>();
        //定义该队列中消息的生存时间 单位毫秒 生存时间最终对应业务的延迟执行时间
        //检查vip有效周期为1天,对应毫秒数为24*60*60*1000
        map.put("x-message-ttl", 24*60*60*1000);
        // x-dead-letter-exchange 属性用于声明死信转发到的交换机
        map.put("x-dead-letter-exchange", "del_cache_check_exchange");
        // x-dead-letter-routing-key 声明了这些死信在转发时携带的路由键名称。
        map.put("x-dead-letter-routing-key", "checkVip");
        return new Queue("check_vip_time_queue", true, false, false, map);
    }
    /**
     * 创建一个交换机用户转发过期的延迟消息
     */
    @Bean
    public DirectExchange deleteCacheCheckExchange(){
        return new DirectExchange("del_cache_check_exchange");
    }
    /**
     * 创建一个队列用于存储死信消息和消费
     */
    @Bean
    public Queue checkVipQueue(){
        return new Queue("check_vip_queue");
    }
    /**
     * 按key绑定队列与交换机
     */
    public Binding bindCheckCacheQueue(){
        return BindingBuilder.bind(checkVipQueue()).to(deleteCacheCheckExchange()).with("checkVip");
    }

    //处理订单过期未支付的延迟队列
//定义一个队列并且要设置过期时间以及死信转发交换机
    @Bean
    public Queue orderProductDelDelayQueue(){
        Map<String, Object> map = new HashMap<>();
        //定义该队列中消息的生存时间 单位毫秒 生存时间最终对应业务的延迟执行时间
        map.put("x-message-ttl", 1000*60*15);//过期时间15分钟
        // x-dead-letter-exchange 属性用于声明死信转发到的交换机
        map.put("x-dead-letter-exchange", "order_product_delay_exchange");
        // x-dead-letter-routing-key 声明了这些死信在转发时携带的路由键名称。
        map.put("x-dead-letter-routing-key", "order_product_del");
        return new Queue("order_product_del_delay_queue",true,false,false,map);
    }

    //创建一个交换机用于转发过期的延迟消息
    @Bean
    public DirectExchange orderProductDelDelayExchange(){
        return new DirectExchange("order_product_delay_exchange");
    }

    //创建一个对于用于存储死信消息的消费
    @Bean
    public Queue orderProductDelQueue(){
        return new Queue("order_product_del_queue",true);
    }

    //绑定队列与交换机
    @Bean
    public Binding bindOrderProductDelCacheQueue(){
        return BindingBuilder.bind(orderProductDelQueue()).to(orderProductDelDelayExchange()).with("order_product_del");
    }

    @Bean
    public Queue orderServiceDelDelayQueue(){
        Map<String, Object> map = new HashMap<>();
        //定义该队列中消息的生存时间 单位毫秒 生存时间最终对应业务的延迟执行时间
        map.put("x-message-ttl", 1000*60*15);//过期时间15分钟
        // x-dead-letter-exchange 属性用于声明死信转发到的交换机
        map.put("x-dead-letter-exchange", "order_service_delay_exchange");
        // x-dead-letter-routing-key 声明了这些死信在转发时携带的路由键名称。
        map.put("x-dead-letter-routing-key", "order_service_del");
        return new Queue("order_service_del_delay_queue",true,false,false,map);
    }

    //创建一个交换机用于转发过期的延迟消息
    @Bean
    public DirectExchange orderServiceDelDelayExchange(){
        return new DirectExchange("order_service_delay_exchange");
    }

    //创建一个对于用于存储死信消息的消费
    @Bean
    public Queue orderServiceDelQueue(){
        return new Queue("order_service_del_queue",true);
    }

    //绑定队列与交换机
    @Bean
    public Binding bindOrderServiceDelCacheQueue(){
        return BindingBuilder.bind(orderProductDelQueue()).to(orderProductDelDelayExchange()).with("order_service_del");
    }
}
